﻿using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WinExplorerAddrHistEraser
{
    class Program
    {
        private const string REG_SUB_KEY_NAME =
            @"Software\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths";

        static void Main(string[] args)
        {
            try
            {
                bool isFinish = false;
                while (!isFinish)
                {
                    // 画面をクリア
                    Console.Clear();

                    // アドレス履歴を保持しているレジストリキーを開く
                    using (var regkey = Registry.CurrentUser.OpenSubKey(REG_SUB_KEY_NAME, true))
                    {
                        // 対象となるレジストリキーが開けなかった場合、終了
                        if (regkey == null)
                        {
                            Console.WriteLine("Registry key does not exist.");
                            return;
                        }

                        // エクスプローラーのアドレス履歴が存在しなかった場合、終了
                        var historyCount = regkey.ValueCount;
                        if (historyCount == 0)
                        {
                            Console.WriteLine("Address history does not exist.");
                            return;
                        }

                        // エクスプローラーのアドレス履歴を表示
                        Console.WriteLine("<Explorer address history>");
                        foreach (var valName in regkey.GetValueNames())
                        {
                            var index = valName;
                            if (valName.ToLower().StartsWith("url"))
                            {
                                index = valName.Substring("url".Length);
                            }
                            Console.WriteLine(string.Format("{0, 3}: {1}", index, regkey.GetValue(valName)));
                        }
                        Console.WriteLine();

                        // 削除する履歴のインデックスについて、ユーザー入力を待つ
                        //Console.Write(string.Format("Input index number to delete history (1-{0}/0/h/q): ", historyCount));
                        Console.Write(string.Format("Input index number to delete history (1-{0}/0/r/q): ", historyCount));
                        var inputedString = Console.ReadLine();

                        // ユーザー入力に従い処理を行う
                        int targetIndex;
                        if (int.TryParse(inputedString, out targetIndex))
                        {
                            if (targetIndex == 0)
                            {
                                /*
                                 * 全履歴を削除
                                 */
                                var deleteIndex = historyCount;
                                while (0 < deleteIndex)
                                {
                                    regkey.DeleteValue(string.Format("url{0}", deleteIndex));
                                    deleteIndex = regkey.ValueCount;
                                }
                            }
                            else if (targetIndex <= historyCount)
                            {
                                /*
                                 * 指定されたインデックスの履歴を削除
                                 */
                                var lastIndex = historyCount;
                                for (int i = targetIndex; i < lastIndex; i++)
                                {
                                    // 最終項目以外はすべて一つずつ前にずらす
                                    var shiftValue = regkey.GetValue(string.Format("url{0}", i + 1));
                                    regkey.SetValue(string.Format("url{0}", i), shiftValue);
                                }
                                // 最終項目は除去
                                regkey.DeleteValue(string.Format("url{0}", lastIndex));
                            }
                            else
                            {
                                /*
                                 * 無効なインデックス値
                                 */
                                Console.WriteLine("Invalid inputed index.");
                            }
                        }
                        else
                        {
                            var inputCommand = inputedString.Trim().ToLower();
                            if ("r" == inputCommand)
                            {
                                /*
                                 * 再読み込み
                                 */
                            }
                            else if ("q" == inputCommand)
                            {
                                /*
                                 * 終了
                                 */
                                isFinish = true;
                            }
                            else
                            {
                                /*
                                 * 無効なコマンド
                                 */
                                Console.WriteLine("Invalid inputed command.");
                            }
                        }

                        regkey.Close();
                    }
                }
            }
            finally
            {
                Console.WriteLine();
                Console.Write("Hit any key.");
                Console.ReadKey();
            }
        }

    }
}
